import copy
import itertools
from common.read_xmind import ReadXmind
from common.test_data import TestData

test_data = TestData()


class QueryFunction:

    def __init__(self, xmind_path, sheet_name):
        self.xmind_data = ReadXmind(path=xmind_path, sheet=sheet_name).processed_data()
        self.result = []

    def generate_case_details(self, template_data, case_title, level, result_text=None):
        """生成用例详情"""
        if result_text is None:
            result_text = '根据输入条件查询出对应数据'
        template_data['用例标题'] = case_title
        template_data['步骤'] = ['输入指定查询条件']
        template_data['结果'] = [result_text]
        template_data['用例等级'] = level
        del template_data['字段']
        try:
            del template_data['关系']
        except KeyError:
            pass
        self.result.append(template_data)

    def generate_case(self, model_data):
        """
        生成用例
        :param model_data: 模块数据
        :return:
        """
        """判断是否存在且、依赖的关系"""
        try:
            """存在关系"""
            relation = model_data['关系']
            """判断是否存在且关系"""
            try:
                just = relation['且']
                """排列组合生成多个条件组合用例"""
                for i in range(len(just) + 1):
                    for j in list(itertools.combinations(just, i)):
                        template_data = copy.deepcopy(model_data)
                        if len(j) == 0:
                            case_title = "{},不输入查询条件，能否查询出所有数据".format(template_data['用例标题'])
                            self.generate_case_details(template_data, case_title, "P1")
                        elif len(j) == 1:
                            case_title = "{},仅输入【{}】条件，能否查询出指定数据".format(template_data['用例标题'], '、'.join(j))
                            self.generate_case_details(template_data, case_title, "P1")
                        else:
                            case_title = "{},同时输入【{}】查询条件(且)，能否查询出指定数据".format(template_data['用例标题'], '、'.join(j))
                            self.generate_case_details(template_data, case_title, "P1")
            except KeyError:
                pass

            """判断是否存在依赖关系"""
            try:
                depend_on = relation['依赖']
                """生成除第一个条件的用例"""
                for i in depend_on:
                    if depend_on.index(i) != 0:
                        template_data = copy.deepcopy(model_data)
                        case_title = "{},仅输入【{}】条件（依赖），能否查询出指定数据".format(template_data['用例标题'], i)
                        self.generate_case_details(template_data, case_title, "P1",
                                                   '无法进行查询，必须输入【{}】条件'.format(depend_on[0]))
                template_data = copy.deepcopy(model_data)
                case_title = "{},同时输入【{},{}】查询条件(依赖)，能否查询出指定数据".format(template_data['用例标题'], depend_on[0],
                                                                       depend_on[-1])
                self.generate_case_details(template_data, case_title, "P1", '无法进行查询，必须输入中间依赖条件')

            except KeyError:
                """不存在依赖关系"""
                pass

        except KeyError:
            """不存在,排列组合生成用例"""
            for i in range(len(model_data['字段']) + 1):
                # 循环组合
                for j in list(itertools.combinations(model_data['字段'], i)):
                    template_data = copy.deepcopy(model_data)
                    if len(j) == 0:
                        case_title = "{},不输入查询条件，能否查询出所有数据".format(template_data['用例标题'])
                        self.generate_case_details(template_data, case_title, "P1")
                    elif len(j) == 1:
                        case_title = "{},仅输入【{}】条件，能否查询出指定数据".format(template_data['用例标题'], '、'.join(j))
                        self.generate_case_details(template_data, case_title, "P1")
                    else:
                        case_title = "{},同时输入【{}】查询条件（或），能否查询出指定数据".format(template_data['用例标题'], '、'.join(j))
                        self.generate_case_details(template_data, case_title, "P1")

    def case(self):
        for model in self.xmind_data:
            # 循环模块
            if model['标签'] == '查询':
                self.generate_case(model)
        return self.result


def result(xmind_path, sheet):
    return QueryFunction(xmind_path=xmind_path, sheet_name=sheet).case()


if __name__ == '__main__':
    import json

    test = result(xmind_path=r'../伏羲.xmind', sheet='画布1')
    print(json.dumps(test, ensure_ascii=False))
